"""
三、多态
 在Python中，多态指的是一类事物有多种形态，如一个父类有多个子类，因而多态的概念依赖于继承。而多态性可以这样描述：向不同的对象发送同一条消息，不同的对象在接收时会产生不同的行为（即方法）。也就是说，每个对象可以用自己的方式去响应同一消息（调用函数）。
【例6-15】  多态示例。
【参考代码】
【程序说明】上述代码中首先定义了Person类，包含who()方法；然后定义了继承Person类的两个子类Student和Teacher，分别在这两个类中重写了who()方法；接着定义了带参数的showInfo()函数，在该函数中调用了who()方法；最后分别创建了Person类的对象p、Student类的对象s和Teacher类的对象t，并将其作为参数调用了showInfo()函数。从程序运行结果可以看出，通过向函数中传入不同的对象，who()方法输出不同的结果。

"""


class Person:  # 定义Person类
    def __init__(self, name):  # 构造方法，定义name
        self.name = name

    def who(self):  # 定义who()方法
        print('我是一个人, 我的名字是{}'.format(self.name))


class Student(Person):  # 定义Student类，继承Person类
    def __init__(self, name, score):  # 重写构造方法
        super().__init__(name)
        self.score = score

    def who(self):  # 重写who()方法
        print('我是一个学生, 我的名字是{}，我的语文成绩是{}'
              .format(self.name, self.score))


class Teacher(Person):  # 定义Teacher类，继承Person类
    def __init__(self, name, course):  # 重写构造方法
        super().__init__(name)
        self.course = course

    def who(self):  # 重写who()方法
        print('我是一个老师, 我的名字是{}，我教{}'
              .format(self.name, self.course))


def showInfo(x):  # 定义函数用于接收对象
    x.who()  # 调用who()方法


# 创建对象
p = Person('小蓝')
s = Student('小明', 88)
t = Teacher('唐果', '语文')
# 调用函数
showInfo(p)
showInfo(s)
showInfo(t)
